package cn.com.darly.vpm.mobile;

import cn.com.darly.vpm.framework.common.StringDiyUtils;
import cn.com.darly.vpm.framework.common.UuidGenerateUtil;
import cn.com.darly.vpm.mobile.cfg.MobileBaseController;
import cn.com.darly.vpm.mobile.session.SessionUtil;
import cn.com.darly.vpm.security.securitycfg.SecurityApi;
import cn.com.darly.vpm.security.user.bean.User;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/** 登录用户发送消息
 * @author Darly/张宇辉/2018/5/21 13:46
 * @version 1.0/cn.com.darly.vpm.mobile
 */
@Controller
@RequestMapping("mobile/user/video")
public class UserVideoController extends MobileBaseController {


    @Resource
    SecurityApi securityApi;

    /**
     * 呼叫好友接口，用户点击按钮或者触发呼叫事件调用此接口，此接口，获取用户和好友信息，并发通知到好友手机，进行呼叫提示。
     */
    @RequestMapping(value = {"/call"}, method = RequestMethod.POST)
    public void onCall(HttpServletRequest request, HttpServletResponse response){
        String browser =findBrowser(request);
        String  usertoken  = request.getHeader("usertoken");
        String friendid = request.getParameter("friendid");
        if (StringDiyUtils.isEmpty(usertoken)||StringDiyUtils.isEmpty(friendid)){
            simpleResult("201","参数缺失",request,response);
            return;
        }
        //获取用户登录信息
        User data = SessionUtil.SESSION_MAP.get(usertoken);
        if (data==null) {
            simpleResult("204","用户登录失效，请登录后重试",request,response);
            return;
        }
        //根据好友ID查询好友信息。
        User user =securityApi.findUserById(friendid);
        if (user == null){
            simpleResult("201","用户ID传递错误，请检查程序",request,response);
            return;
        }
        String rtmp = securityApi.rtmpUrlByUsername(data.getName(),user.getName());
        //根据需求，进行发送通知，使对方启动被呼叫展示页面
        String json = JSON.toJSONString(data);//将自己的信息发送给对方，对方针对此信息，可以展示通话请求页面
        publishMessage("200#"+json+"#"+rtmp,user.getDeviceId());
        saveLog(data.getId(),"0",0,3,data.getName(),browser,"["+data.getName()+"对"+user.getName()+"发起视频通话请求；呼叫流媒体地址为："+rtmp+"]");
        dataResult("200","成功发起呼叫",rtmp,request,response);
    }


    /**
     * 呼叫好友接口，用户点击按钮或者触发呼叫事件调用此接口，此接口，获取用户和好友信息，并发通知到好友手机，进行呼叫提示。
     */
    @RequestMapping(value = {"/callconsole"}, method = RequestMethod.POST)
    public void onCallConsole(HttpServletRequest request, HttpServletResponse response){
        String browser =findBrowser(request);
        String  usertoken  = request.getHeader("usertoken");
        String friendid = request.getParameter("friendid");
        if (StringDiyUtils.isEmpty(usertoken)||StringDiyUtils.isEmpty(friendid)){
            simpleResult("201","参数缺失",request,response);
            return;
        }
        //获取用户登录信息
        User data = SessionUtil.SESSION_MAP.get(usertoken);
        if (data==null) {
            simpleResult("204","用户登录失效，请登录后重试",request,response);
            return;
        }
        //根据好友ID查询好友信息。
        User user =securityApi.findUserById(friendid);
        if (user == null){
            simpleResult("201","用户ID传递错误，请检查程序",request,response);
            return;
        }
        //根据需求，进行发送通知，使对方启动被呼叫展示页面
        String json = JSON.toJSONString(data);//将自己的信息发送给对方，对方针对此信息，可以展示通话请求页面
        publishMessage("201#"+json,user.getDeviceId());
        saveLog(data.getId(),"0",0,3,data.getName(),browser,"["+data.getName()+"对"+user.getName()+"结束视频通话请求]");
        dataResult("200","成功结束请求",true,request,response);
    }



    /**
     * 接收到对方的来电，接收后，根据用户信息，发送通知给对方，并建立临时RTMP流媒体地址。
     */
    @RequestMapping(value = {"/accept"}, method = RequestMethod.POST)
    public void onAccept(HttpServletRequest request, HttpServletResponse response){
        String browser =findBrowser(request);
        String  usertoken  = request.getHeader("usertoken");
        String friendid = request.getParameter("friendid");
        if (StringDiyUtils.isEmpty(usertoken)||StringDiyUtils.isEmpty(friendid)){
            simpleResult("201","参数缺失",request,response);
            return;
        }
        //获取用户登录信息
        User data = SessionUtil.SESSION_MAP.get(usertoken);
        if (data==null) {
            simpleResult("204","用户登录失效，请登录后重试",request,response);
            return;
        }
        //根据好友ID查询好友信息。
        User user =securityApi.findUserById(friendid);
        if (user == null){
            simpleResult("201","用户ID传递错误，请检查程序",request,response);
            return;
        }
        String rtmp = securityApi.rtmpUrlByUsername(data.getName(),user.getName());
        //根据需求，同意视频通话后，发送通话加密连接给对方。
        saveLog(data.getId(),"0",0,3,data.getName(),browser,"["+data.getName()+"接受"+user.getName()+"的视频通话；接受流媒体地址为："+rtmp+"]");
        String json = JSON.toJSONString(data);//将自己的信息发送给对方，对方针对此信息，可以展示通话请求页面
        publishMessage("400#"+json+"#"+rtmp,user.getDeviceId());
        dataResult("200","成功接受视频通话",rtmp,request,response);
    }

    /**
     * 接收到对方的来电，接收后，根据用户信息，发送通知给对方，并建立临时RTMP流媒体地址。
     */
    @RequestMapping(value = {"/refuse"}, method = RequestMethod.POST)
    public void onRefuse(HttpServletRequest request, HttpServletResponse response){
        String browser =findBrowser(request);
        String  usertoken  = request.getHeader("usertoken");
        String friendid = request.getParameter("friendid");
        if (StringDiyUtils.isEmpty(usertoken)||StringDiyUtils.isEmpty(friendid)){
            simpleResult("201","参数缺失",request,response);
            return;
        }
        //获取用户登录信息
        User data = SessionUtil.SESSION_MAP.get(usertoken);
        if (data==null) {
            simpleResult("204","用户登录失效，请登录后重试",request,response);
            return;
        }
        //根据好友ID查询好友信息。
        User user =securityApi.findUserById(friendid);
        if (user == null){
            simpleResult("201","用户ID传递错误，请检查程序",request,response);
            return;
        }
        //根据需求，同意视频通话后，发送通话加密连接给对方。
        saveLog(data.getId(),"0",0,3,data.getName(),browser,"["+data.getName()+"拒绝"+user.getName()+"的视频通话]");
        String json = JSON.toJSONString(data);//将自己的信息发送给对方，对方针对此信息，可以展示通话请求页面
        publishMessage("401#"+json,user.getDeviceId());
        dataResult("200","成功拒绝视频通话",true,request,response);
    }
}
